package main

import "fmt"

/*type Circle struct {//一个Circle代表的圆形类型包含了标准圆心的X和Y坐标信息
	X int
	Y int
	Radius int
}*/
/*
type Wheel struct {//一个Wheel轮形除了包含Circle类型所有的全部成员外，还增加了Spokes表示径向辐条的数量
	X int
	Y int
	Radius int
	Spokes int
}*/

type Point struct {
	X, Y int
}
type Circle struct {
	Center Point
	Radius int
}
type Wheel struct {
	Circle Circle
	Spokes int
}

/*func main() {
	c := Circle{}
	c.Center.X = 1
	c.Center.Y = 2
	c.Radius = 3
	fmt.Printf("%+v\n",c)
}*/
type Point2 struct {
	XX, YY int
}
type Circle2 struct {
	Point2//匿名成员，相当于把自身所包含的元素嵌入到当前的结构体中
	RadiusR int
}
type Wheel2 struct {
	Circle2
	SpokesS int
}

func main() {

	c := Circle2{}
	c.XX = 12// 等于c.Point2.YY = 12
	c.YY = 13
	fmt.Printf("%+v\n",c)//{Point2:{XX:12 YY:13} RadiusR:0}
	//注意打印的时候依然会带着匿名成员的标识，只是在使用上轻量了一些，但实际结构依然是之前的
	w := Wheel2{}
	w.XX = 11
	w.YY = 13
	w.RadiusR = 15
	w.SpokesS = 19
	fmt.Printf("%+v\n",w)//{Circle2:{Point2:{XX:11 YY:13} RadiusR:15} SpokesS:19}
	//因为匿名成员也有一个隐式的名字，因此不能同时包含两个类型相同的匿名成员，这会导致
	//名字冲突
}